package dxf.sections;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import dxf.DXFElement;
import dxf.annotations.DXFElementType;
import dxf.annotations.DXFProperty;
import dxf.annotations.DXFSubElements;
import dxf.annotations.DXFTerminator;
import dxf.annotations.DXFValueMap;



/**
 * La classe <code>Header</code> rappresenta la sezione HEADER in un DXFFle.
 *
 * @author Andrea Zonca
 * @author Michele Brignoli
 * @version 2.0
 */

@DXFElementType("SECTION")
@DXFTerminator("ENDSEC")
public class Header implements DXFElement {
	@DXFSubElements
	private List<HeaderVar> vars;

	/**
	 * Crea un'istanza di Header, creando e inizializzando un vettore di HeaderVar
	 */
	public Header(){
		vars = new ArrayList<HeaderVar>();

		vars.add((new HeaderVar("$ACADVER")).putValue(1, "AC1015"));
		vars.add((new HeaderVar("$HANDSEED")).putValue(5, "FFFF"));
	}

	/**
	 * Restituisce il vettore di HeaderVar
	 *
	 * @return il vettore di HeaderVar
	 */
	public List<HeaderVar> getVars() {
		return vars;
	}

	/**
	 * Aggiunge una HeaderVar alla collezione
	 *
	 * @param var la HeaderVar da aggiungere
	 * @return l'oggetto che ha chiamto il metodo
	 */
	public Header addVar(HeaderVar var) {
		vars.add(var);
		return this;
	}

	/**
	 * La classe <code>HeaderVar</code> permette la rappresentazione delle coppie (chiave, valore)
	 *
	 * @author Andrea Zonca
	 * @author Michele Brignoli
	 * @author luisro
	 * @version 1.0
	 */
	@DXFElementType(shown=false, value = "")
	public class HeaderVar implements DXFElement {
		@DXFProperty(9)
		private String varName;

		@DXFValueMap
		private Map<Integer, Object> values;

		/**
		 * Crea un'istanza di HeaderVar
		 * @param varName il nome della variabile
		 */
		public HeaderVar (String varName) {
			this.varName = varName;
			values = new HashMap<Integer, Object>();
		}

		/**
		 * Restituisce il nome della HeaderVar
		 * @return il nome della HeaderVar
		 */
		public String getVarName(){
			return varName;
		}

		/**
		 * Imposta il nome della HeaderVar
		 *
		 * @param varName il nome della HeaderVar
		 * @return l'oggetto che ha chiamato il metodo
		 */
		public HeaderVar setVarName(String varName){
			this.varName = varName;
			return this;
		}

		/**
		 * Restituisce la mappa di coppie (chiave, valore)
		 * @return la mappa di coppie
		 */
		public Map<Integer,Object> getValues() {
			return values;
		}

		/**
		 * Permette di inserire un nuovo valore in corrisponenza della chiave
		 *
		 * @param code la chiave
		 * @param value il valore da inserire
		 * @return l'oggetto che ha chiamato il metodo
		 */
		public HeaderVar putValue(int code, Object value) {
			values.put(code, value);
			return this;
		}
	}



}


